package com.kzy.demoadmin.web.controller;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.github.pagehelper.PageInfo;
import com.kzy.demoadmin.web.entity.BookType;
import com.kzy.demoadmin.web.entity.BookTypeQuery;
import com.kzy.demoadmin.web.entity.Result;
import com.kzy.demoadmin.web.exception.BizException;
import com.kzy.demoadmin.web.service.BookTypeService;
import jakarta.servlet.ServletOutputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.*;

/**
 * 图书分类控制器
 */
@RestController
@RequestMapping("bookTypes")
public class BookTypeController {

    @Autowired
    private BookTypeService bookTypeService;

    // 新增分类
    @PostMapping("/add")
    public Result addBookType(@RequestBody BookType bookType) {
        return Result.success(bookTypeService.addBookType(bookType));
    }

    // 根据ID删除分类
    @DeleteMapping("/{id}")
    public Result deleteBookType(@PathVariable Integer id) {
        return Result.success(bookTypeService.deleteBookTypeById(id));
    }

    // 更新分类
    @PostMapping("/edit")
    public Result updateBookType(@RequestBody BookType bookType) {
        return Result.success(bookTypeService.updateBookType(bookType));
    }

    // 根据ID查询分类
    @GetMapping("/{id}")
    public Result getBookTypeById(@PathVariable Integer id) {
        return Result.success(bookTypeService.getBookTypeById(id));
    }

    // 查询所有分类+模糊查询
    @GetMapping("/list")
    public Result getAllBookTypes(@ModelAttribute BookTypeQuery query) {//@ModelAttribute起到绑定作用
        PageInfo<BookType> info = bookTypeService.getAllBookTypes(query);
        return Result.success(info);
    }

    //批量删除
    @PostMapping("/delBatch")
    public Result delBatch(@RequestBody List<BookType> bookTypes) {
        //判断集合是否为空avatarPath
        if (bookTypes != null && bookTypes.size() > 0) {
            for (BookType bookType : bookTypes) {
                Result.success(bookTypeService.deleteBookTypeById(bookType.getId()));
            }
            return Result.success();
        }
        return Result.error("请选择要删除的项");
    }

    @GetMapping("/export")
    public Result export(HttpServletResponse response) throws IOException {
        // 1. 查询数据库数据
        List<BookType> all = bookTypeService.getAll();
        if (CollectionUtil.isEmpty(all)) {
            throw new BizException("未找到数据");
        }

        // 2. 组装数据为Map列表
        List<Map<String, Object>> list = new ArrayList<>(all.size());
        for (BookType bookType : all) {
            Map<String, Object> row = new HashMap<>();
            row.put("分类名称", bookType.getName());
            row.put("分类描述", bookType.getDescription());
            list.add(row);
        }

        // 3. 创建ExcelWriter并配置样式
        ExcelWriter wr = ExcelUtil.getWriter(true);

        // ===== 合并第0行的A、B列为总表头 =====
        // 格式：merge(起始行, 结束行, 起始列, 结束列, 内容, 是否自动换行)
        wr.merge(0, 0, 0, 1, "图书分类信息", true);

        // ===== 写入列表头到第1行 =====
        // 先将写入指针移动到第1行（默认从0行开始，写完总表头后指针在0行，需手动移动）
        wr.setCurrentRow(1);
        // 写入列表头（"分类名称"到第1行0列，"分类描述"到第1行1列）
        wr.writeRow(Arrays.asList("分类名称", "分类描述"));

        // ===== 写入数据到第2行及以后 =====
        // isWriteKeyAsHead设为false（已手动写表头，无需用Map的key再生成表头）
        wr.write(list, false);

        // ===== 自动调整列宽（根据内容自适应） =====
        wr.autoSizeColumn(0); // 第0列（分类名称）
        wr.autoSizeColumn(1); // 第1列（分类描述）

        // 4. 下载Excel
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        // 解决中文文件名乱码问题（URLEncoder编码）
        String fileName = java.net.URLEncoder.encode("图书分类表", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
        ServletOutputStream out = response.getOutputStream();
        wr.flush(out, true);
        // 关闭资源（先关writer，再关输出流）
        wr.close();
        IoUtil.close(out); // 注意：应关闭的是response的输出流，而非System.out

        return Result.success();
    }

    // 导入
    @PostMapping("/import")
    public Result upload(MultipartFile file) throws IOException {
        // 读取Excel把里面的每一行数据存到list 中
        List<BookType> info = ExcelUtil.getReader(file.getInputStream()).readAll(BookType.class);
        if (!CollectionUtil.isEmpty(info)) {
            for(BookType bookType : info){
                try {
                    //如果是新增的时候，有异常给他catch住
                    bookTypeService.addBookType(bookType);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
            return Result.success();
      }

}